/*==========================================================
    模块名 :    RtspClt
    文件名 ：   circlequeue.h
    相关文件 ：  
    实现功能 ： 简单的环形队列，用于过滤重复的http请求
    作者：      范瑞彪
    版 权 ：    <Copyright(C) 2023-2027 Suzhou Keda Technology Co., Ltd. 
    All rights reserved.> 
    ------------------------------------------------------------------------------------------------------- 
    修改记录：
    日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
==========================================================*/
#ifndef RTSPCLT_CIRCLEQUEUE_H
#define RTSPCLT_CIRCLEQUEUE_H
#include <pthread.h>
#include "pub_defs.h"

// @brief 环形队列节点定义
typedef struct tagCircleQueueItem
{
    char achToken[POST_PARAM_VAL_BUF_LEN];  // http请求token
    tagCircleQueueItem *pNext;              // 下一节点指针
}CircleQueueItem,*PCircleQueueItem;

// @brief 环境队列结构体定义
typedef struct tagCircleQueue
{
    PCircleQueueItem *ptHead;               // 环形队列头
    PCircleQueueItem *ptTail;               // 环形队列尾巴
    int nMaxSize;                           // 环形队列节点个数
    int nNodeCnt;                           // 当前环形队列节点个数
    PMutex  ptMutex;                        // 互斥锁指针 
}CircleQueue,*PCircleQueue;

/*========================================================== 
    函数名 ：   CreateCircleQueue
    功能 ：		创建环形队列
    算法实现 ： <可选项> 
    参数说明 ： int     nMaxSize     [in]    环形队列最大长度
                int     nWithMutex  [in]    是否需要加锁(0 不需要 1 需要)
    返回值说明：NULL创建失败，否则返回队列地址（环形队列释放需要调用 DeleteCircleQueue方法）
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
PCircleQueue CreateCircleQueue(int nMaxSize,int nWithMutex);

/*========================================================== 
    函数名 ：   DeleteCircleQueue
    功能 ：		释放环形队列
    算法实现 ： <可选项> 
    参数说明 ： PCircleQueue     ptQueue     [in]    环形队列指针
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void DeleteCircleQueue(PCircleQueue ptQueue);

/*========================================================== 
    函数名 ：   CircleQueueExistsToken
    功能 ：		判断队列中是否存在此toke
    算法实现 ： <可选项> 
    参数说明 ： PCircleQueue     ptQueue     [in]    环形队列指针
                char*           paToken     [in]    token字符串
    返回值说明：0 不包含 1 包含
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int QueueExistsToken(PCircleQueue ptQueue,char *paToken);

/*========================================================== 
    函数名 ：   AppendItem
    功能 ：		队列中添加数据
    算法实现 ： <可选项> 
    参数说明 ： PCircleQueue     ptQueue     [in]    环形队列指针
                char*           paToken     [in]    token字符串
    返回值说明：0 成功 1 失败（除非队列构筑失败，节点个数小于1，否则不会失败)
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int AppendItem(PCircleQueue ptQueue,char *paToken);


#endif //RTSPCLT_CIRCLEQUEUE_H